home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / cmds / ftp / new / domacro.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-10-27  |  3.1 KB  |  145 lines

  1. /*
  2.  * Copyright (c) 1985 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted
  6.  * provided that the above copyright notice and this paragraph are
  7.  * duplicated in all such forms and that any documentation,
  8.  * advertising materials, and other materials related to such
  9.  * distribution and use acknowledge that the software was developed
  10.  * by the University of California, Berkeley.  The name of the
  11.  * University may not be used to endorse or promote products derived
  12.  * from this software without specific prior written permission.
  13.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  14.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  15.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  16.  */
  17.  
  18. #ifndef lint
  19. static char sccsid[] = "@(#)domacro.c    1.6 (Berkeley) 2/28/89";
  20. #endif /* not lint */
  21.  
  22. #include "ftp_var.h"
  23.  
  24. #include <signal.h>
  25. #include <stdio.h>
  26. #include <errno.h>
  27. #include <ctype.h>
  28. #include <sys/ttychars.h>
  29.  
  30. domacro(argc, argv)
  31.     int argc;
  32.     char *argv[];
  33. {
  34.     register int i, j;
  35.     register char *cp1, *cp2;
  36.     int count = 2, loopflg = 0;
  37.     char line2[200];
  38.     extern char **glob(), *globerr;
  39.     struct cmd *getcmd(), *c;
  40.     extern struct cmd cmdtab[];
  41.  
  42.     if (argc < 2) {
  43.         (void) strcat(line, " ");
  44.         printf("(macro name) ");
  45.         (void) gets(&line[strlen(line)]);
  46.         makeargv();
  47.         argc = margc;
  48.         argv = margv;
  49.     }
  50.     if (argc < 2) {
  51.         printf("Usage: %s macro_name.\n", argv[0]);
  52.         code = -1;
  53.         return;
  54.     }
  55.     for (i = 0; i < macnum; ++i) {
  56.         if (!strncmp(argv[1], macros[i].mac_name, 9)) {
  57.             break;
  58.         }
  59.     }
  60.     if (i == macnum) {
  61.         printf("'%s' macro not found.\n", argv[1]);
  62.         code = -1;
  63.         return;
  64.     }
  65.     (void) strcpy(line2, line);
  66. TOP:
  67.     cp1 = macros[i].mac_start;
  68.     while (cp1 != macros[i].mac_end) {
  69.         while (isspace(*cp1)) {
  70.             cp1++;
  71.         }
  72.         cp2 = line;
  73.         while (*cp1 != '\0') {
  74.               switch(*cp1) {
  75.                    case '\\':
  76.                  *cp2++ = *++cp1;
  77.                  break;
  78.                 case '$':
  79.                  if (isdigit(*(cp1+1))) {
  80.                     j = 0;
  81.                     while (isdigit(*++cp1)) {
  82.                       j = 10*j +  *cp1 - '0';
  83.                     }
  84.                     cp1--;
  85.                     if (argc - 2 >= j) {
  86.                     (void) strcpy(cp2, argv[j+1]);
  87.                     cp2 += strlen(argv[j+1]);
  88.                     }
  89.                     break;
  90.                  }
  91.                  if (*(cp1+1) == 'i') {
  92.                     loopflg = 1;
  93.                     cp1++;
  94.                     if (count < argc) {
  95.                        (void) strcpy(cp2, argv[count]);
  96.                        cp2 += strlen(argv[count]);
  97.                     }
  98.                     break;
  99.                 }
  100.                 /* intentional drop through */
  101.                 default:
  102.                 *cp2++ = *cp1;
  103.                 break;
  104.               }
  105.               if (*cp1 != '\0') {
  106.              cp1++;
  107.               }
  108.         }
  109.         *cp2 = '\0';
  110.         makeargv();
  111.         c = getcmd(margv[0]);
  112.         if (c == (struct cmd *)-1) {
  113.             printf("?Ambiguous command\n");
  114.             code = -1;
  115.         }
  116.         else if (c == 0) {
  117.             printf("?Invalid command\n");
  118.             code = -1;
  119.         }
  120.         else if (c->c_conn && !connected) {
  121.             printf("Not connected.\n");
  122.             code = -1;
  123.         }
  124.         else {
  125.             if (verbose) {
  126.                 printf("%s\n",line);
  127.             }
  128.             (*c->c_handler)(margc, margv);
  129.             if (bell && c->c_bell) {
  130.                 (void) putchar('\007');
  131.             }
  132.             (void) strcpy(line, line2);
  133.             makeargv();
  134.             argc = margc;
  135.             argv = margv;
  136.         }
  137.         if (cp1 != macros[i].mac_end) {
  138.             cp1++;
  139.         }
  140.     }
  141.     if (loopflg && ++count < argc) {
  142.         goto TOP;
  143.     }
  144. }
  145.